package com.tom.service.impl;

import com.tom.constants.BaseConstants;
import com.tom.constants.ErrorCode;
import com.tom.domain.Employee;
import com.tom.domain.Login;
import com.tom.domain.Tenant;
import com.tom.dto.LoginAndMealIdDto;
import com.tom.dto.TenantRegisterDto;
import com.tom.exception.GloblException;
import com.tom.feign.clients.LoginFeignClient;
import com.tom.mapper.TenantMapper;
import com.tom.service.IEmployeeService;
import com.tom.service.ITenantService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.tom.util.AjaxResult;
import com.tom.util.AssertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.security.GeneralSecurityException;
import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author pengh.liu
 * @since 2021-11-20
 */
@Service
public class TenantServiceImpl extends ServiceImpl<TenantMapper, Tenant> implements ITenantService {

    @Autowired
    private LoginFeignClient loginFeignClient;

    @Autowired
    private IEmployeeService employeeService;

    @Override
    public void register(TenantRegisterDto tenantRegisterDto) {
//        参数校验（非空校验，格式校验，重复的校验）
        Employee employee = tenantRegisterDto.getEmployee();
        Login login = tenantRegisterDto.getLogin();
        Tenant tenant = tenantRegisterDto.getTenant();
        Long mealId = tenantRegisterDto.getMealId();
        // 使用断言工具,加上枚举产生错误代码和错误信息
        AssertUtil.isNotEmpty(employee.getTel(), ErrorCode.LOGIN_TEL_IS_NULL.getFullMessage());

        if (login.getUsername() == null || login.getPassword()==null){
            throw new GloblException("登录名为空或者密码为空");
        }
        if (mealId==null){
            throw new GloblException("中间表id为空");
        }

//        保存Login表，密码加密   ,保存结构和套餐的关系
        LoginAndMealIdDto loginAndMealIdDto = new LoginAndMealIdDto();
        // 设置login类型
        login.setType(BaseConstants.Login.LOGIN_BACKGROUND);
        loginAndMealIdDto.setLogin(login);
        loginAndMealIdDto.setMealId(mealId);
        AjaxResult ajaxResult = loginFeignClient.saveLoginAndMeal(loginAndMealIdDto);


        // 由于返回的是Integer类型需要转换成long类型
        Long loginId = Long.valueOf(ajaxResult.getResultObj().toString());
//        保存员工表
        // 判断是否降级，还有返回的loginId是否为空
        if (!ajaxResult.isSuccess() || loginId == null){
            throw new RuntimeException("认证异常");
        }
        employee.setLoginId(loginId);
        employee.setRealName(employee.getTel());
        employee.setInputTime(new Date());
        employee.setState(BaseConstants.Employee.EMPLOYEE_NORMAL);
        employee.setType(BaseConstants.Employee.INSTITUTIONS_ADMIN);
        employeeService.insert(employee);
//                保存机构表
//		（保存顺序不能乱，先保存其他表需要的外键的）
        // 管理员的id
        tenant.setAdminId(employee.getId());
        // 创建的时间
        tenant.setRegisterTime(new Date());
        // 审核的状态
        tenant.setState(BaseConstants.tenant.TENANT_TO_BE_CONFIRMED);

        insert(tenant);
        // 机构表保存之后返回的自增主键为员工表中的一个外键
        employee.setTenantId(tenant.getId());
        employeeService.updateById(employee);
    }
}
